"""
FastAPI + OpenTelemetry 演示应用

启动方式：
1. uv venv && uv sync
2. uv run uvicorn main:app --reload
"""

from typing import Any, Dict

import os

import requests
from fastapi import FastAPI

from instrumentation import init_otel, instrument_fastapi_app


# 1. 初始化 OTel
service_name = os.getenv("SERVICE_NAME", "otel-fastapi-demo")
init_otel(service_name=service_name)

# 2. 创建 FastAPI 应用
app = FastAPI(title="OTel FastAPI Demo", version="0.1.0")

# 3. 对 FastAPI 应用进行自动接入
instrument_fastapi_app(app)


@app.get("/")
def read_root() -> Dict[str, Any]:
    """根路由，返回基本信息。

    1. 返回服务名与提示信息
    """
    return {"message": "Hello, OpenTelemetry!", "service": service_name}


@app.get("/external")
def call_external() -> Dict[str, Any]:
    """演示外部 HTTP 调用以生成出站 span。

    1. 请求 httpbin.org/get
    2. 返回状态码与对端 headers
    """
    resp = requests.get("https://httpbin.org/get", timeout=5)
    data = resp.json()
    return {
        "status_code": resp.status_code,
        "origin": data.get("origin"),
        "headers": data.get("headers", {}),
    }


@app.get("/healthz")
def healthz() -> Dict[str, str]:
    """健康检查。

    1. 返回 ok
    """
    return {"status": "ok"}


if __name__ == "__main__":
    # 仅用于本地快速启动；推荐使用：uv run uvicorn main:app --reload
    import uvicorn

    uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)
